package design_pattern.singleton;

import lombok.Data;

/**
 * 枚举类：用于隐藏单例类
 * 枚举对象持有单例对象的引用
 * 利用类加载机制保证线程安全
 */
public enum EnumSingleton {
    // 枚举对象
    INSTANCE;

    // 枚举对象的属性，持有单例对象
    private final Singleton instance;

    // 枚举对象的构造器，只在调用EnumSingleton.INSTANCE时加载（懒加载）
    EnumSingleton() {
        instance = new Singleton();
    }

    // 获得实例的方法
    public Singleton getInstance() {
        return instance;
    }

}

/**
 * 单例类，被藏在枚举类的内部
 */
@Data
class Singleton {
    private String name = "sangzhan";
    private Integer age = 10;

}

class Test {
    public static void main(String[] args) {
        Singleton instance = EnumSingleton.INSTANCE.getInstance();
        System.out.println(instance);
    }
}